package serialize;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Date;

/**
 * DAO : Data Access Object ，数据访问对象
 */
public class PersonDao {
	
	private Charset charset = Charset.forName( "UTF-8" );
	
	/**
	 * 将 Person 对象中的各个字段的值保存到指定的文件中
	 * @param p 被保存的对象
	 * @param file 用来存储 Person 对象中各个字段值的文件
	 */
	public void write( Person p , File file ) throws IOException {
		OutputStream out = new FileOutputStream(file);
		DataOutputStream dos = new DataOutputStream(out);
		
		dos.writeInt( p.getId() ); // 保存 id
		
		String name = p.getName();
		final byte[] bytes = name.getBytes( charset );
		
		int length = bytes.length; // 获取字节数组的长度
		dos.writeInt( length ) ; // 使用 4 个字节先保存 字节数组 的长度
		
		dos.write( bytes ); // 将 bytes 数组中全部字节统统写出 ( 保存 姓名 )
		
		dos.writeChar( p.getGender() ); // 保存 性别
		
		Date bd = p.getBirthdate();
		long time = ( bd == null ? 0 :bd.getTime() );
		dos.writeLong( time ); // 以毫秒值保存 出生日期
		
		dos.close();
		out.close();
	}
	
	/**
	 * 读取指定文件中的字节数据并将其重构为 Person 类型的实例
	 * @param file
	 * @return
	 */
	public Person read( File file ) throws IOException {
		
		Person p = new Person();
		
		InputStream in = new FileInputStream( file );
		DataInputStream dis = new DataInputStream( in );
		
		int id = dis.readInt() ;  // 读取 id
		
		int length = dis.readInt(); // 读取曾经的字节数组长度
		byte[] bytes = new byte[ length ]; // 创建一个字节数组
		dis.readFully( bytes ); // 读取姓名对应的字节数组
		String name = new String( bytes , charset ); // 将字节序列解码为字符串
		
		char gender = dis.readChar() ;
		
		long time = dis.readLong();
		Date birthdate = new Date( time );
		
		p.setId( id );
		p.setName( name );
		p.setGender( gender );
		p.setBirthdate(birthdate);
		
		dis.close();
		in.close();
		
		return p ;
	}

}
